﻿using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MVC高级教程.Options;
using NUnit.Framework;

namespace MVC高级教程.Controllers
{

    /// <summary>
    /// 演示如使用配置文件
    /// </summary>
    public class ConfigrationController : Controller
    {
        private readonly IConfiguration _configuration;
        private readonly ILogger _logger;

        //获取已经注册为服务的配置类  (通过IOptions接口来拿已经注册的配置类)
        private readonly IOptions<RedisOptions> _redisOptions;

        public ConfigrationController(IConfiguration configuration, ILogger logger,IOptions<RedisOptions> redisOptions)
        {
            _configuration = configuration;
            _logger = logger;//日志服务，简单好用
            _redisOptions = redisOptions;//拿到已注册为服务的配置类
        }


      
        public IActionResult Index()
        {

            #region 最原始的方法，获取配置文件（这种写法不符合面向对象的写法）
                //单级配置
                var siteName = _configuration["SiteName"].ToString();

                _logger.LogInformation(siteName);//日志输出    如果development.json里有就会读取，如果development里面没有，就从appsetting.json里读

                //读取多级配置
                var host = _configuration["NoSQL:Redis:Redis"].ToString(); //读取多级配置，“:”

                _logger.LogInformation(host);
            #endregion

            #region 将整个节点保存到类中，（符合面向对象的的方法，但是比较繁琐）  
                //一次性读取整个节点，映射到类中
                //拿到整个节点，然后映射到RedisOptions类中
                var redisSection = _configuration.GetSection("NoSQL:Redis");//多级配置，用":"
                var redisOptions = redisSection.Get<RedisOptions>();
            #endregion

            #region 将节点内的配置信息保存保存到类中，将类注册为服务(终极办法)
            //一定要先到Program中注册
            //终极解决办法，在Program文件中将RedisOptions类注册成服务（请到program中查看,RedisOptions已经被注册为服务）
            var redis = _redisOptions.Value;
            #endregion



            return View();
        }
    }
}
